﻿//题目描述
//小明的花店新开张，为了吸引顾客，他想在花店的门口摆上一排花，共m 盆。
//通过调查顾客的喜好，小明列出了顾客最喜欢的n 种花，从1 到n 标号。
//为了在门口展出更多种花，规定第i 种花不能超过𝑎𝑖​盆，摆花时同一种花放在一起，
//且不同种类的花需按标号的从小到大的顺序依次摆列。
//试编程计算，一共有多少种不同的摆花方案。
//输入格式
//第一行包含两个正整数n 和m，中间用一个空格隔开。
//第二行有n 个整数，每两个整数之间用一个空格隔开，依次表示𝑎1,𝑎2,⋯,𝑎𝑛
//输出格式
//一个整数，表示有多少种方案。注意：因为方案数可能很多，请输出方案数对10^6+ 7 取模的结果。
//样例 
//样例输入 
//2 4
//3 2
//样例输出 
//2
//提示
//样例的方案为：[1, 1, 1, 2]和[1, 1, 2, 2]。
//【数据范围】1≤n≤100, 1≤m≤100, 0≤ai​≤100。 
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 105;
const int p = 1e6 + 7;
ll a[N],dp[N][N];//dp[i][j]:到第i种花结尾，一共放了j盆花的总方案数
int main() {
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	ll n, m; cin >> n >> m;
	for (int i = 1; i <= n; i++)cin >> a[i];
	dp[0][0] = 1;
	//dp[i][j] = dp[i-1][j] + dp[i-1][j-1] + ... + dp[i-1][j-a[i]]
	for (int i = 1; i <= n; ++i) {//到第i种花为止，且以i结尾
		for (int j = 0; j <= m; ++j) {//一共放了j盆花
			for (int k = 0; k <= a[i] && k <= j; ++k) {//最后有连续的k盆i花
				dp[i][j] = (dp[i][j] + dp[i - 1][j - k]);
			}
		}
	}
	cout << dp[n][m]<< '\n';
	return 0;
}